package org.visionlibrary.image.filters.binarization;
//package kar.image.processor.binarization;
//
//import java.awt.image.BufferedImage;
//import java.awt.image.Raster;
//
//import kar.image.Image;
//import kar.image.processor.ImageProcessor;
//import kar.thread.utils.ForOperation;
//import kar.thread.utils.ImageMultiThreadFor;
//
//public class NiblackBinarizationProcessor implements ImageProcessor {
//
//	//rozmiar od centralnego w każdą strone ilość piksli to (ENV_SIZE*2+1)^2
//	private final int envSize;
//	private final double k;
//	
//	public NiblackBinarizationProcessor(int size, double k){
//		this.envSize = size;
//		this.k = k;
//	}
//	
//	public NiblackBinarizationProcessor(){
//		this.envSize = 7;
//		this.k = -0.2;
//	}
//	
//	public Image process(final Image img) {
//		final Image resultImg = img.clone();
//		final Raster raster = img.getData();
//		final int size = envSize*2+1;
//
//		// MULTI THREAD IMPLEMENTATION
//		
//		ImageMultiThreadFor.getInstance().forImage(img, new ForOperation(){
//			public void doInFor(int x, int y, BufferedImage image) {
//				if( x >= envSize && x < img.getWidth()-envSize &&
//					y >= envSize && y < img.getHeight()-envSize ){
//					int xx = x-envSize;
//					int yy = y-envSize;
//					resultImg.setRGB(x, y, 
//						operation(raster.getSamples(xx, yy, size, size, 0, (int[]) null))
//					);
//					
//				}
//				
//			}
//		});
//
//// SINGLE THREAD IMPLEMENTATION
////		for (int i = envSize; i < img.getHeight()-envSize; i++) {
////			for (int j = envSize; j < img.getWidth()-envSize; j++) {
////				int x = j-envSize;
////				int y = i-envSize;
////				resultImg.setRGB(x, y, 
////					operation(raster.getSamples(x, y, size, size, 0, (int[]) null))
////				);
////			}
////		}
//
//		return resultImg;
//	}
//	
//	private int operation(int[] lut){
//		double sampleMean = 0;
//		for (int i = 0; i < lut.length; i++) {
//			sampleMean+=lut[i];
//		}
//		sampleMean /= lut.length;
//		
////		if(sampleMean < 50){
////			return 0xffffff;
////		}
//		
//		double standartDeviation = 0;
//		for (int i = 0; i < lut.length; i++) {
//			standartDeviation+=Math.pow(lut[i]-sampleMean, 2);
//		}
//		standartDeviation = Math.sqrt(standartDeviation/(double)lut.length);
//		
//		//System.out.println(standartDeviation);
//		if(standartDeviation < 5){
//			return 0xffffff;
//		}
//		
//		
//		double treashold = sampleMean + k * standartDeviation; 
//		
//		return lut[lut.length/2+1]>treashold?0x00ffffff:0x0;
//	}
//	
//
//}
